#ifndef __APP_EEPROM_MANAGE_H
#define __APP_EEPROM_MANAGE_H

#include "stm32f10x.h"
#include "user_config.h"


/* ===================== EEPROM地址分配 ===================== */

// 旧地址分配(保留兼容)
#define EEPROM_ADDR_UV_WORKTIME      0x0000  // UV灯工作时间(秒) (4字节 uint32_t) - 旧
#define EEPROM_ADDR_TOTAL_FLOW       0x0004  // 累计流量 (4字节 float)
#define EEPROM_ADDR_DATA_VALID_FLAG  0x0008  // 数据有效标志 (1字节 0x5A=有效)

// 新地址分配(UV控制状态机相关)
#define EEPROM_ADDR_UV_WORKTIME_HOURS  0x000C  // UV累计工作时间(小时) (4字节 uint32_t)
#define EEPROM_ADDR_IGNORE_FLAG1       0x0010  // "忽略1"标志位 (1字节 uint8_t)
#define EEPROM_ADDR_IGNORE_FLAG2       0x0011  // "忽略2"标志位 (1字节 uint8_t)
#define EEPROM_ADDR_HUMIDITY_TH        0x0012  // 湿度阈值 (2字节 uint16_t)
#define EEPROM_ADDR_FLOW_TH            0x0014  // 流量阈值 (2字节 uint16_t)
#define EEPROM_ADDR_VALUE100           0x0016  // UV辐射度标准值 (2字节 uint16_t)
#define EEPROM_ADDR_UV_DATA_VALID_FLAG 0x0018  // UV状态机数据有效标志 (1字节 0xA5=有效)

#define EEPROM_DATA_VALID_FLAG_VALUE   0x5A    // 旧数据有效标志值
#define EEPROM_UV_DATA_VALID_FLAG_VALUE 0xA5   // UV状态机数据有效标志值


/* ===================== 函数声明 ===================== */

/**
 * @brief  从EEPROM加载数据
 * @param  None
 * @retval None
 * @note   系统初始化时调用,加载历史数据到g_user_config
 */
void app_eeprom_load_data(void);

/**
 * @brief  保存数据到EEPROM
 * @param  None
 * @retval 0=成功, 1=失败
 * @note   将g_user_config中的数据保存到EEPROM,并通过回读验证
 */
u8 app_eeprom_save_data(void);

/**
 * @brief  EEPROM自动保存管理
 * @param  None
 * @retval None
 * @note   在主循环中周期性调用(建议1秒一次),根据策略自动保存
 */
void app_eeprom_auto_save(void);

/**
 * @brief  清除EEPROM数据
 * @param  None
 * @retval None
 * @note   清除所有历史数据,恢复出厂设置
 */
void app_eeprom_clear_data(void);

/**
 * @brief  保存UV工作时间(小时)到EEPROM
 * @param  hours UV累计工作时间(小时)
 * @return 无
 * @note   仅保存UV工作时间,不保存其他数据
 */
void app_eeprom_save_uv_worktime(uint32_t hours);

/**
 * @brief  从EEPROM读取UV工作时间(小时)
 * @param  无
 * @return uint32_t UV累计工作时间(小时)
 */
uint32_t app_eeprom_read_uv_worktime(void);

/**
 * @brief  设置忽略标志位到EEPROM
 * @param  flag_id 标志位ID (1="忽略1", 2="忽略2")
 * @param  value 标志位值 (0=未设置, 1=已设置)
 * @return 无
 */
void app_eeprom_set_ignore_flag(uint8_t flag_id, uint8_t value);

/**
 * @brief  从EEPROM读取忽略标志位
 * @param  flag_id 标志位ID (1="忽略1", 2="忽略2")
 * @return uint8_t 标志位值 (0=未设置, 1=已设置)
 */
uint8_t app_eeprom_get_ignore_flag(uint8_t flag_id);

/**
 * @brief  清除所有UV相关EEPROM数据("更换成功"按键调用)
 * @param  无
 * @return 无
 * @note   清除UV工作时间、"忽略1"、"忽略2"标志位
 */
void app_eeprom_reset_uv_data(void);


#endif /* __APP_EEPROM_MANAGE_H */
